<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2018/5/13
 * Time: 15:29
 */

namespace common\helps;


use app\models\ArcAndroid;
use app\models\ArcProgress;
use app\models\ArcTrain;

class Foo
{
    //阿里云下使用的
    function fooAliContinue($command,$parms,$arcTrainModel)
    {
        $arcTrainModel = ArcTrain::findOne($parms['arc_train']);
        if ($arcTrainModel->progress == 3) {//如果是中止了，就需要停止
            exit();
        }
        $command = "export LANG='en_US.UTF-8';" . $command;//执行java必须需要，不然可能会出现返回的中文变成?
//        $out = shell_exec("/usr/local/php/bin/php ../../yii dosomething/index \"".$command."\" \"".$parms."\"  > /dev/null 2>&1 &");
        exec("php ../../yii dosomething/index \"" . $command . "\" '" . json_encode($parms) . "'> /dev/null 2>&1 &", $out2);
//        exec("/usr/local/php/bin/php ../../yii dosomething/index \"".$command."\" '".json_encode($parms)."'",$out2);
        exit();
    }
    //阿里云下使用的
    function fooAli($command,$parms,$arcTrainModel) {
        $command = "export LANG='en_US.UTF-8';".$command;//执行java必须需要，不然可能会出现返回的中文变成?
//        $out = shell_exec("/usr/local/php/bin/php ../../yii dosomething/index \"".$command."\" \"".$parms."\"  > /dev/null 2>&1 &");
        exec("php ../../yii dosomething/index \"".$command."\" '".json_encode($parms)."'> /dev/null 2>&1 &",$out2);
//        exec("/usr/local/php/bin/php ../../yii dosomething/index \"".$command."\" '".json_encode($parms)."'",$out2);
        echo json_encode($parms);
        exit();
//        $proc = proc_open($command,
//            array(
//                0 => array('pipe','r'), //stdin (用fwrite写入数据给管道)
//                1 => array('pipe','w'), //stdout(用stream_get_contents获取管道输出)
//                2 => array('pipe','w'), //stderr(用stream_get_contents获取管道输出)
//                //2 => array('file','/tmp/err.txt','a') //stderr(写入到文件)
//            ),
//            $pipes, //管道(stdin/stdout/stderr)
//            "./asr/".$parms['thing_recordfile'], //当前PHP进程的工作目录
//            array('foo' => 'bar') //php.ini 配置 variables_order = "EGPCS" 其中E表示$_ENV,否则$_ENV输出为空
//        );
//        if(is_resource($proc)) {
//            $stdin = serialize(array('time' => time()));
//            fwrite($pipes[0], $stdin); //把参数传给脚本task.php
//            fclose($pipes[0]); //fclose关闭管道后proc_close才能退出子进程,否则会发生死锁
//                register_shutdown_function(function () use($pipes, $proc,$parms) { //事件驱动(脚本结束事件),异步回调
//                //stdout
//                $stdout = stream_get_contents($pipes[1]);
//                fclose($pipes[1]);
//                //stderr
//                $stderr = stream_get_contents($pipes[2]);
//                fclose($pipes[2]);
//                //exit code (返回进程的终止状态码,如果发生错则返回-1)
//                $status = proc_close($proc);
//                $data = array(
//                    'stdout' => $stdout,
//                    'stderr' => $stderr,
//                    'status' => $status,
//                );
//                $res = $data['stdout'];
////                    $resArr = Tools::baiduresultToArray($res);//拿到了结果，然后存入数据库
//                $resArr = Tools::aliyunresultToArray($res);//拿到了结果，然后存入数据库
//                $resStr = json_encode($resArr);//将得到的数组转化为json字符串
////                if(file_exists($parms['tempPath']))unlink($parms['tempPath']);
//                $this->saveToSql($resStr,$parms);
//                exit();
//            });
//        }
    }

    //阿里云下使用的
    function fooAli2($command,$parms,$arcTrainModel) {
        $command = "export LANG='en_US.UTF-8';".$command;//执行java必须需要，不然可能会出现返回的中文变成?
        $proc = proc_open($command,
            array(
                0 => array('pipe','r'), //stdin (用fwrite写入数据给管道)
                1 => array('pipe','w'), //stdout(用stream_get_contents获取管道输出)
                2 => array('pipe','w'), //stderr(用stream_get_contents获取管道输出)
                //2 => array('file','/tmp/err.txt','a') //stderr(写入到文件)
            ),
            $pipes, //管道(stdin/stdout/stderr)
            "./asr/".$parms['thing_recordfile'], //当前PHP进程的工作目录
            array('foo' => 'bar') //php.ini 配置 variables_order = "EGPCS" 其中E表示$_ENV,否则$_ENV输出为空
        );
        if(is_resource($proc)) {
            $stdin = serialize(array('time' => time()));
            fwrite($pipes[0], $stdin); //把参数传给脚本task.php
            fclose($pipes[0]); //fclose关闭管道后proc_close才能退出子进程,否则会发生死锁
            register_shutdown_function(function () use($pipes, $proc,$parms) { //事件驱动(脚本结束事件),异步回调
                //stdout
                $stdout = stream_get_contents($pipes[1]);
                fclose($pipes[1]);
                //stderr
                $stderr = stream_get_contents($pipes[2]);
                fclose($pipes[2]);
                //exit code (返回进程的终止状态码,如果发生错则返回-1)
                $status = proc_close($proc);
                $data = array(
                    'stdout' => $stdout,
                    'stderr' => $stderr,
                    'status' => $status,
                );
                $res = $data['stdout'];
//                    $resArr = Tools::baiduresultToArray($res);//拿到了结果，然后存入数据库
                $resArr = Tools::aliyunresultToArray($res);//拿到了结果，然后存入数据库
                $resStr = json_encode($resArr);//将得到的数组转化为json字符串
//                if(file_exists($parms['tempPath']))unlink($parms['tempPath']);
                $this->saveToSql($resStr,$parms);
                exit();
            });
        }
    }

    //百度云下使用的
   function fooBaidu($command,$parms,$arcTrainModel) {
//        $command = "export LANG='en_US.UTF-8';".$command;//执行java必须需要，不然可能会出现返回的中文变成?
        $proc = proc_open($command,
            array(
                0 => array('pipe','r'), //stdin (用fwrite写入数据给管道)
                1 => array('pipe','w'), //stdout(用stream_get_contents获取管道输出)
                2 => array('pipe','w'), //stderr(用stream_get_contents获取管道输出)
                //2 => array('file','/tmp/err.txt','a') //stderr(写入到文件)
            ),
            $pipes, //管道(stdin/stdout/stderr)
            null, //当前PHP进程的工作目录
            array('foo' => 'bar') //php.ini 配置 variables_order = "EGPCS" 其中E表示$_ENV,否则$_ENV输出为空
        );
        if(is_resource($proc)) {
            $stdin = serialize(array('time' => time()));
            fwrite($pipes[0], $stdin); //把参数传给脚本task.php
            fclose($pipes[0]); //fclose关闭管道后proc_close才能退出子进程,否则会发生死锁
            register_shutdown_function(function() use($pipes, $proc,$parms) { //事件驱动(脚本结束事件),异步回调
                //stdout
                $stdout = stream_get_contents($pipes[1]);
                fclose($pipes[1]);
                //stderr
                $stderr = stream_get_contents($pipes[2]);
                fclose($pipes[2]);
                //exit code (返回进程的终止状态码,如果发生错则返回-1)
                $status = proc_close($proc);
                $data = array(
                    'stdout' => $stdout,
                    'stderr' => $stderr,
                    'status' => $status,
                );
                $res = $data['stdout'];
                    $resArr = Tools::baiduresultToArray($res);//拿到了结果，然后存入数据库
//                $resArr = Tools::aliyunresultToArray($res);//拿到了结果，然后存入数据库
                $resStr = json_encode($resArr);//将得到的数组转化为json字符串
                $this->saveToSql($resStr,$parms);
                exit();
            });
            exit();
        }
    }

    function saveToSql($resStr,$parms){
        //开启事务
        $arcTrainModel = ArcTrain::findOne($parms['arc_train']);
        $arcAndroidModel = ArcAndroid::findOne($arcTrainModel->arc_android);
        if($arcTrainModel->progress==3){//如果是中止了，就需要停止
            echo -5;exit();
        }
        if($arcTrainModel->progress_num>=$arcAndroidModel->onetime_num){//如果是中止了，就需要停止
            //查到此条机器人，更新相应的参数，训练的数据数加1
            $arcTrainModel->updateAttributes(['progress' => 2]);//更新arc_train的progress_num新增1
            echo -7;exit();
        }
        $arcProgressModel = new ArcProgress();
        $arcProgressModel->arc_language = $resStr;
        $arcProgressModel->progress = $parms['progress'];
        $arcProgressModel->thing_recordfile = $parms['thing_recordfile'];
        $arcProgressModel->arc_train = $parms['arc_train'];
        $arcProgressModel->arc_classify = $parms['arc_classify'];
        $classifySearch = new ClassifySearch();
        $arc_classify_status = $classifySearch->search_classify($parms['arc_classify'],$resStr);
        $arcProgressModel->arc_classify_status = $arc_classify_status;
        $arcProgressModel->create_time = time();
        $arcProgressModel->ip = Tools::getip();
        $arcProgressModel->save();//更新识别的结果，识别完成
        //查到此条机器人，更新相应的参数，训练的数据数加1
        $arcTrainModel->updateAttributes(['progress_num' => $arcTrainModel->progress_num + 1, 'progress' => 1,'update_time'=>time()]);//更新arc_train的progress_num新增1
        /* 以下是训练的方法 */
        $res = [
            'arcTrainId' => $arcTrainModel->id,
            'arcTrainProgressNum' => $arcTrainModel->progress_num,
            'onetimeNum' => $arcAndroidModel->onetime_num
        ];
        echo json_encode($res);
        exit();
    }

}